#pragma once

#include "NetworkMessage.h"
#include <functional>
#include <memory>
#include <string>

namespace SeanNetwork {

// 连接状态
enum class ConnectionState {
    Disconnected,
    Connecting,
    Connected,
    Reconnecting,
    Failed
};

// 网络统计信息
struct NetworkStats {
    uint64_t TotalBytesSent;       // 总发送字节数
    uint64_t TotalBytesReceived;   // 总接收字节数
    uint64_t MessagesSent;         // 发送消息数
    uint64_t MessagesReceived;     // 接收消息数
    uint64_t PacketLoss;           // 丢包数
    uint64_t Retransmissions;      // 重传次数
    uint32_t AverageRtt;           // 平均往返时间（毫秒）
    uint32_t LatestRtt;            // 最新往返时间（毫秒）
    
    NetworkStats()
        : TotalBytesSent(0), TotalBytesReceived(0), MessagesSent(0), MessagesReceived(0),
          PacketLoss(0), Retransmissions(0), AverageRtt(0), LatestRtt(0) {
    }
};

// 消息接收回调函数类型
using MessageReceiveCallback = std::function<void(std::shared_ptr<NetworkMessage>)>;

// 连接状态变更回调函数类型
using ConnectionStateCallback = std::function<void(ConnectionState, const std::string&)>;

// 网络通道接口
class INetworkChannel {
public:
    virtual ~INetworkChannel() = default;
    
    // 初始化通道
    virtual bool Initialize() = 0;
    
    // 连接到远程主机
    virtual bool Connect(const std::string& host, uint16_t port) = 0;
    
    // 断开连接
    virtual void Disconnect() = 0;
    
    // 发送消息
    virtual bool SendMsg(std::shared_ptr<NetworkMessage> message) = 0;
    
    // 设置消息接收回调
    virtual void SetMessageCallback(MessageReceiveCallback callback) = 0;
    
    // 设置连接状态回调
    virtual void SetConnectionCallback(ConnectionStateCallback callback) = 0;
    
    // 获取当前连接状态
    virtual ConnectionState GetConnectionState() const = 0;
    
    // 获取当前网络统计信息
    virtual NetworkStats GetNetworkStats() const = 0;
    
    // 获取通道类型
    virtual ChannelType GetChannelType() const = 0;
    
    // 获取延迟（毫秒）
    virtual uint32_t GetLatency() const = 0;
    
    // 更新通道（触发内部处理）
    virtual void Update() = 0;
};

} // namespace SeanNetwork
